package leetcode.editor.cn;

/**
 * 题目Id：剑指 Offer 20
 * 题目：表示数值的字符串
 * 日期：2023-08-25 08:52:33
 */
//请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。 
//
// 数值（按顺序）可以分成以下几个部分： 
//
// 
// 若干空格 
// 一个 小数 或者 整数 
// （可选）一个 'e' 或 'E' ，后面跟着一个 整数 
// 若干空格 
// 
//
// 小数（按顺序）可以分成以下几个部分： 
//
// 
// （可选）一个符号字符（'+' 或 '-'） 
// 下述格式之一： 
// 
// 至少一位数字，后面跟着一个点 '.' 
// 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字 
// 一个点 '.' ，后面跟着至少一位数字 
// 
// 
//
// 整数（按顺序）可以分成以下几个部分： 
//
// 
// （可选）一个符号字符（'+' 或 '-'） 
// 至少一位数字 
// 
//
// 部分数值列举如下： 
//
// 
// ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"] 
// 
//
// 部分非数值列举如下： 
//
// 
// ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"] 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "0"
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：s = "e"
//输出：false
// 
//
// 示例 3： 
//
// 
//输入：s = "."
//输出：false 
//
// 示例 4： 
//
// 
//输入：s = "    .1  "
//输出：true
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 20 
// s 仅含英文字母（大写和小写），数字（0-9），加号 '+' ，减号 '-' ，空格 ' ' 或者点 '.' 。 
// 
//
// Related Topics 字符串 👍 536 👎 0


public class BiaoShiShuZhiDeZiFuChuanLcof {
    public static void main(String[] args) {
        Solution solution = new BiaoShiShuZhiDeZiFuChuanLcof().new Solution();
        boolean numeric = solution.isNumeric("+E3");
        System.out.println(numeric);

        System.out.println("Hello world");
    }


    /**
     * 字符串的数值
     * 思路：把字符串整体分为3个部分，总体符合，在判断个体
     * 1，前后空格；2，e或者E前面的部分；3,后面的部分
     * 第二部分细节：开头+/-（可选）   整数。整数；.整数；整数   三选一
     * 第三部分细节：E/e +/-(可选)  整数
     */


    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public boolean isNumeric(String s) {
            if (s == null) {
                return false;
            }
            s = s.trim();
            if (s.length() == 0) {
                return false;
            }
            int indexd = 0;
            int n = 0;
            //判断有几个e 记录e的下标
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == 'e' || s.charAt(i) == 'E') {
                    indexd = i;
                    n++;
                }
            }
            Boolean b1 = true, b2 = true, b3 = true;
            if (n > 1) {
                return false;
            }
            if (n == 1) {
                //判断2部分
                b1 = charge2(s.substring(0, indexd));
                //判断3部分
                b2 = charge3(s.substring(indexd));
            }
            if (n == 0) {
                //直接判断2部分
                b3 = charge2(s);
            }
            if (b1 && b2 && b3) {
                return true;
            }
            return false;

        }

        /**
         * 、
         * 判断2部分
         */
        public Boolean charge2(String s) {
            if (s.length() > 0) {
                if (s.charAt(0) == '+' || s.charAt(0) == '-') {
                    s = s.substring(1);
                }
                if (s.length() > 0) {


                    s = s.replaceFirst("\\.", "");
                    if ("".equals(s)) {
                        return false;
                    }
                    for (int i = 0; i < s.length(); i++) {
                        if (s.charAt(i) < '0' || s.charAt(i) > '9') {
                            return false;
                        }
                    }
                    return true;
                } else {
                    return false;
                }


            } else {
                return false;
            }


        }

        //判断第三部分
        public Boolean charge3(String s) {
            if (s.length() < 2) {
                return false;
            }
            s = s.substring(1);
            if (s.charAt(0) == '+' || s.charAt(0) == '-') {
                s = s.substring(1, s.length());
            }
            if (s.length() == 0) {
                return false;
            }
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) < '0' || s.charAt(i) > '9') {
                    return false;
                }
            }
            return true;
        }

    }

//leetcode submit region end(Prohibit modification and deletion)

} 
